package controlador;

import java.util.Collection;
import java.util.Vector;

import javax.swing.table.TableModel;

import negocio.HoraCargadas;
import negocio.Persona;
import negocio.Proyecto;
import negocio.ReporteAdministracion;
import negocio.ReporteResultado;
import negocio.Tarea;
import persistencia.AdmPersistenciaCostos;
import persistencia.AdmPersistenciaEmpleado;
import persistencia.AdmPersistenciaJerarquia_Rol;
import persistencia.AdmPersistenciaProyecto;
import persistencia.AdmPersistenciaTarea;
import vista.PostCosto;

public class Sistema 
{
	//TODO para que estan los vectores si no los usamos?..
	@SuppressWarnings("unused")
	private Vector<Persona> personas;
	@SuppressWarnings("unused")
	private Vector<Tarea> tareas;
	@SuppressWarnings("unused")
	private Vector<Proyecto> proyectos;
	private static Sistema instancia;
	
	public Sistema(){
		
	}
	
	public void cargarHoras(long IdTarea, int horas, String fecha, long idEmp)
	{
		Tarea t = AdmPersistenciaTarea.getInstancia().selectTareaPorId(IdTarea,idEmp);
		if(t.getHorasTotalCargadas()+ horas < t.getHorasAsignadas()){
			java.sql.Date dt = java.sql.Date.valueOf(fecha);
			HoraCargadas hc = new HoraCargadas(IdTarea,horas,dt);
			t.getHorasCargadas().add(hc);
			Utils.setResultado("Se han cargado las horas exitosamente");
		}else{
			java.sql.Date dt = java.sql.Date.valueOf(fecha);
			int hsACargar = t.getHorasAsignadas()-t.getHorasTotalCargadas();
			HoraCargadas hc = new HoraCargadas(IdTarea,hsACargar,dt);
			t.getHorasCargadas().add(hc);
			Utils.setResultado("Se ha alcanzado/superado la cantidad de horas asignadas a la tarea");
		}

	}
	
	public double getReporteProductivudad(Long idProyecto)
	{
		ReporteResultado ra = new ReporteResultado();
		double porcentajeProductividad = ra.getReporte2(idProyecto);
		System.out.println(porcentajeProductividad);
		return porcentajeProductividad;
	}
	
	public double getReporteRentabilidad(Long idproyecto)
	{
		ReporteResultado ra = new ReporteResultado();
		double porcentajeRentabilidad = ra.getReporteRentabilidad(idproyecto);
		System.out.println(porcentajeRentabilidad);
		return porcentajeRentabilidad;
	}
	
	public Vector<Integer> getReporteAdministracion(String proy) {
		ReporteAdministracion ra = new ReporteAdministracion();
		return ra.getReporteAdministracios(buscarIdProyecto(proy));
	}
	

	public static Sistema getInstancia() {
		if (instancia == null)
			instancia = new Sistema();
		return instancia;
	}
	
	public long buscarIdUsuario(String usr){
		return AdmPersistenciaEmpleado.getInstancia().selectIdPorUsuario(usr);
	}

	public String[] buscarNombreTareasUsuario(Long id) {
		String[] nombresTarea = new String[100];
		int i = 0;
		Collection <Tarea> tareas = AdmPersistenciaTarea.getInstancia().selectTareasEmpleado(id);
		for (Tarea t : tareas) {
			nombresTarea[i] = t.getNombre();
			i++;
		}
		return nombresTarea;
	}

	public Long buscarIdTarea(String tarea) {
		return Tarea.getInstancia().buscarIdTarea(tarea);
	}

	public String[] buscarJerarquias() {
		String[] jerarquias = AdmPersistenciaJerarquia_Rol.getInstancia().selectAllJer();
		return jerarquias;
	}
	
	public String[] buscarProyecto()
	{
		String[] proyectos = AdmPersistenciaProyecto.getInstancia().selectAllProyecto();
		return proyectos;
		
	}

	public String[] buscarRoles() {
		String[] roles = AdmPersistenciaJerarquia_Rol.getInstancia().selectAllRol();
		return roles;
	}

	public String[] buscarRecursos(String jerarquia, String rol) {
		return AdmPersistenciaEmpleado.getInstancia().selectRecursoBusqueda(jerarquia,rol);
	}
	
	public Long obtenerPerfil(Long idEmpl){
		return AdmPersistenciaEmpleado.getInstancia().selectPerfil(idEmpl);
	}

	public boolean validarIngreso(Long clave, String usuario) {
		return AdmPersistenciaEmpleado.getInstancia().validate(clave, usuario);
	}

	public void altaModifCostos(String jerarquia, String rol, long monto) {
		long idJer = AdmPersistenciaJerarquia_Rol.getInstancia().getIdJer(jerarquia);
		long idRol = AdmPersistenciaJerarquia_Rol.getInstancia().getIdRol(rol);
		long valor = AdmPersistenciaCostos.getInstancia().selectCosto(idJer,idRol);
		if(valor == -1){
			long idCosto = AdmPersistenciaCostos.getInstancia().generarId();
			AdmPersistenciaCostos.getInstancia().insert(idCosto,idJer,idRol,monto);
		}else{
			
			Utils.setJerarquia(jerarquia);
			Utils.setRol(rol);
			Utils.setMontoPrevio(valor);
			Utils.setMontoNuevo(monto);
			PostCosto pc = PostCosto.getInstancia();
			pc.setLocationRelativeTo(null);
			pc.setVisible(true);
		}
	}

	public void modificarCosto() {
		long idJer = AdmPersistenciaJerarquia_Rol.getInstancia().getIdJer(Utils.getJerarquia());
		long idRol = AdmPersistenciaJerarquia_Rol.getInstancia().getIdRol(Utils.getRol());
		long valor = Utils.getMontoNuevo();
		AdmPersistenciaCostos.getInstancia().update(idJer,idRol,valor);
	}

	public Long buscarIdProyecto(String proyecto) {
		return Proyecto.getInstancia().buscarIdProyecto(proyecto);
		
	}

	public TableModel getHorasCargadas(Long long1) {
		
		return AdmPersistenciaProyecto.getInstancia().selectAllHs(long1);
	}
	
	

}
